home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 19
/
Aminet 19 (1997)(GTI - Schatztruhe)[!][Jun 1997].iso
/
Aminet
/
biz
/
dbase
/
Ax.lha
/
Ax
/
Rexx
/
FTP_AmiFTP.ax
< prev
next >
Wrap
Text File
|
1997-03-15
|
9KB
|
352 lines
/*
* Ax ARexx-FTP interface script
* FTP client: AmiFTP
* $VER: FTP_AmiFTP.ax 1.0 (26.6.96)
*
* Version 1.0
* by Paul A. Schifferer
* Copyright 1996-7 © Isengard Developments
*
* This script is freely distributable and modifiable. You are authorized to
* modify it to suit your needs. Isengard Developments makes no warranty,
* express or implied, for its usability or reliability in its original or
* modified form.
*
* This script takes an optional list of files to retrieve with the FTP client
* program noted above. If 'files' aren't specified on the command line, the
* script will attempt to interface with Ax, using the ARexx port name "AXFTP"
* to get files. Alternatively, 'files' can be "LIST=filename", which
* specifies the list of files to use (see below). If files are specified on
* the command line for this script, then the first parameter must be the site
* name, the second the base directory, and all subsequent parameters are
* files in the form of 'path/filename' (relative to the base path).
*
* The file list is in the following format:
*
* The first line is the site from which to retrieve the files. The second
* line is the base directory to use, e.g., '/pub/aminet', without the
* trailing slash. This dir should always be an absolute path, i.e., with
* the beginning slash.
*
* All subsequent lines are files to retrieve in the form of 'path/filename',
* e.g., "biz/dbase/Ax.lha". 'path' need not be specified, if the file is
* located in the base directory. Note that all paths should be specified
* relative to the base directory, but this is not a requirement. Absolute
* pathnames may be used.
*
* A line with three hashes ('###') ends the filelist. Everything thereafter
* is ignored.
*/
options results
signal on syntax
signal on error
parse arg files
/*
* Is Ax running?
* (Ax must be running if a list of files is not specified, else it has no
* place to get them...)
*/
if (length(files) = 0) & ~show('P',"AX") then do
say "Ax must be running to use this script!"
exit 20
end
/*
* Set up some variables.
*/
clientname = "AmiFTP"
scriptname = "FTP_"clientname".ax"
clientpath = "AmiFTP"
clientopts = "ICONIFIED"
clientport = "AMIFTP"
ftpport = ""
/*
* Command variables.
*
* The following variables are commands that would be issued to the FTP client
* program. The construct is simple: "command parameter options". Place
* the client's command portion in the variable <a-cmd>cmd, where <a-cmd> is
* the type of command. This script will place after the command any parameters
* that are necessary. If the command has options to be specified, place them
* in the variable <a-cmd>opts. These will be placed at the end of the command,
* after the parameters.
*
* For example, the "GET" command for DaFTP allows you to specify the transfer
* mode. To set up this command, you would put "GET" in the variable 'getcmd',
* and "BINARY" in the variable 'getopts'. When the command is issued, it
* will be sent to DaFTP as "GET <filename> BINARY".
*
* It's really very simple. If you are having problems with it, just send me
* e-mail <gandalf@hughes.net>, and we'll work it out, okay?
*/
sitecmd = "SITE"
siteopts = ""
connectcmd = "CONNECT"
connectopts = ""
portcmd = "PORT"
portopts = ""
binarycmd = ""
binaryopts = ""
cdcmd = "CD"
cdopts = ""
lcdcmd = "LCD"
lcdopts = ""
getcmd = "GET"
getopts = "BIN"
quitcmd = "QUIT"
quitopts = ""
/*
* Check if environment var for FTPCLIENT is set and use it. The first line
* in the var would be the full path of the FTP client to use. The second
* line, which is optional, specifies any options to use on the command line
* when starting the client program.
*/
if exists("ENV:FTPCLIENT") then do
if open('fc',"ENV:FTPCLIENT",'R') then do
line = strip(readln('fc'))
if length(line) > 0 then clientpath = line
line = strip(readln('fc'))
if length(line) > 0 then clientopts = line
end
call close('fc')
end
/*
* Start FTP client.
*/
if ~show('P',clientport) then do
say "Starting FTP client..."
address command "Run >NIL: "clientpath clientopts
end
/*
if rc ~= 0 then do
say scriptname": Error" rc "trying to start FTP client '"clientname"'!"
exit 10
end
*/
/*
* Wait for ARexx port to appear (2 minute timeout).
*/
call time('R')
do forever
if show('P',clientport) then leave
call Delay(250)
if time('E') > 120 then do
say scriptname": Timeout waiting for client port '"clientport"'!"
exit 10
end
end
/*
* Set up port #.
*/
address value(clientport)
if length(ftpport) > 0 then do
""portcmd ftpport portopts
end
/*
* Get site name & base dir.
*/
address AXFTP
"Site"
site = result
"BaseDir"
basedir = result
/*
* Connect to site.
*/
address value(clientport)
""sitecmd site siteopts
if length(connectcmd) > 0 then do
""connectcmd connectopts
end
if rc ~= "0" then do
say scriptname": Unable to connect to site '"site"'!"
address AX "ErrorReq" scriptname" ("rc"): Unable to connect to site '"site"'!"
address AXFTP "Status" scriptname" ("rc"): Unable to connect to site '"site"'!"
exit 10
end
/*
* Set transfer mode.
*/
if length(binarycmd) > 0 then do
""binarycmd binaryopts
end
/*
* Were files or a filelist specified?
*/
filelist = ""
if length(files) > 0 then do
if upper(substr(files,1,5)) = "LIST=" then do
filelist = word(substr(files,6),1)
c = usefilelist(filelist)
if c ~= 0 then exit c
signal thatsit
end
else do
c = usefiles(files)
if c ~= 0 then exit c
signal thatsit
end
end
/*
* The following code controls interaction with Ax (via the ARexx ports AX and
* AXFTP) and the FTP client to grab files.
*/
/* tell Ax to start FTP thread, if not running */
address AX
"StartFTP"
if result = "0" then do
say scriptname": Unable to start Ax's FTP thread!"
exit 10
end
call time('R')
do forever
if show('P',"AXFTP") then leave
call Delay(250)
if time('E') > 120 then do
say scriptname": Timeout waiting for port 'AXFTP'!"
exit 10
end
end
/*
* Reset file list.
*/
address AXFTP
"ResetFilelist"
/*
* Main file retrieval loop.
*/
do forever
address AXFTP
"GetFilename"
file = result
if file = "" then leave
"GetPath ABSOLUTE"
path = result
/* get file */
address AXFTP "Status Changing remote directory to '"path"'..."
address value(clientport) ""cdcmd path cdopts
address AXFTP "Status Retrieving '"file"'..."
address value(clientport) ""getcmd file getopts
address AXFTP
"SetFile DOWNLOADED"
"RemoveFile"
"NextFile"
end
thatsit:
/*
* Tell FTP client to shut down.
*/
if length(quitcmd) > 0 then do
address value(clientport)
""quitcmd quitopts
end
exit 0
/*
* This procedure lets the script grab files via the FTP client using a file
* list.
*/
usefilelist:
parse arg flist
error = 0
if open('fl',flist,'R') then do
site = strip(readln('fl'))
basedir = strip(readln('fl'))
do while ~eof('fl')
fpath = readln('fl')
if fpath = "###" then leave
if substr(fpath,1,1) = "/" then do /* absolute pathname */
fpath = reverse(fpath)
parse fpath fname "/" fpath
fpath = reverse(fpath)
fname = reverse(fname)
end
else if index(fpath,"/") > 0 then do /* relative pathname is specified */
fpath = reverse(basedir"/"fpath)
parse fpath fname "/" fpath
fpath = reverse(fpath)
fname = reverse(fname)
end
else do
fname = fpath
fpath = basedir
end
address value(clientport)
""cdcmd fpath cdopts
""getcmd fname getopts
end
call close('fl')
end
return error
/*
* This procedure lets the script grab files via the FTP client using files
* specified on the command line.
*/
usefiles:
parse arg site basedir flist
error = 0
do forever
parse var flist fpath flist
if fpath = "" then leave
if substr(fpath,1,1) = "/" then do /* absolute pathname */
fpath = reverse(fpath)
parse fpath fname "/" fpath
fpath = reverse(fpath)
fname = reverse(fname)
end
else if index(fpath,"/") > 0 then do /* relative pathname is specified */
fpath = reverse(basedir"/"fpath)
parse fpath fname "/" fpath
fpath = reverse(fpath)
fname = reverse(fname)
end
else do
fname = fpath
fpath = basedir
end
end
address value(clientport)
""cdcmd fpath cdopts
""getcmd fname getopts
end
return error
syntax:
err = rc
parse source . . . me .
address AX "ErrorReq ARexx error" err "in line" sigl "of" me"."
exit
error:
parse source . . . me .
address AX "ErrorReq Error" rc "in line" sigl "of" me"."